package com.sicau.socialpracticesystem.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Objects;

/**
 * @author ：xiongtao29、shixingtong3
 * @version :2.0
 * @description ：文件处理工具类
 * @date ： 2020/2/13 20:01
 * @copyright : Copyright 2019 智能城市 icity.jd.com ALL Right Reserved
 */
@Slf4j
public class ExcelUtil {
    public static InputStream getResourcesFileInputStream(String fileAddress) {
        return Thread.currentThread().getContextClassLoader().getResourceAsStream(fileAddress);
    }

    /**
     * 通过响应写文件数据
     *
     * @param response    响应对象
     * @param fileAddress 文件地址
     * @param fileName    导出文件名
     */
    public static void writeResponseOutputFile(HttpServletResponse response, String fileAddress, String fileName) {
        try (
                InputStream in = getResourcesFileInputStream(fileAddress);
                ServletOutputStream out = response.getOutputStream();
        ) {
            log.info("------开始处理模板文件下载操作请求，模板路径：{},文件名：{}------",fileAddress,fileName);
            //文件响应相关的设置
            preWrite(response, fileName);
            //因为是xls类型文件excel2003，所以需要用HSSFWorkbook而不是XSSFWorkbook
            log.info("------模板文件读入操作------");
            HSSFWorkbook workbook = new HSSFWorkbook(in);
            log.info("------模板文件响应写出操作------");
            workbook.write(out);
            out.flush();
            log.info("------处理模板文件下载操作请求完成------");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 写文件前的设置
     *
     * @param response 响应对象
     * @param fileName 文件名
     */
    private static void preWrite(HttpServletResponse response, String fileName) {
        log.info("------进行文件响应相关设置------");

        response.setContentType("application/octet-stream;charset=UTF-8");

        //对文件名编码
        fileName = encode(fileName);

        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
    }

    /**
     * 字符串编码
     *
     * @param text 原始文本（多为文件名）
     * @return 转换结果
     */
    private static String encode(String text) {
        log.info("------对特定字符串进行URL编码，字符串信息：{}------",text);
        String tmp = text;
        try {
            tmp = URLEncoder.encode(tmp, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            log.error("编码出现错误，将返回原始字符串信息，错误信息为：{}",e.getMessage());
            return text;
        }
        /*
         * see http://support.microsoft.com/default.aspx?kbid=816868
         */
        if (tmp.length() > 150) {
            String guessCharset = "UTF-8"; /*根据request的locale 得出可能的编码，中文操作系统通常是gb2312*/
            try {
                tmp = new String(tmp.getBytes(guessCharset), "ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                log.error("编码出现错误，将返回原始字符串信息，错误信息为：{}",e.getMessage());
                return text;
            }
        }
        log.info("------完成对特定字符串的URL编码-，编码结果：{}-----",tmp);
        return tmp;
    }

    /**
     * 判断一个MultipartFile文件是否为excel
     *
     * @param file MultipartFile文件对象
     * @return 布尔值
     */
    public static boolean isExcel(MultipartFile file) {
        if (file == null) {
            return false;
        }
        String filename = Objects.requireNonNull(file.getOriginalFilename()).toLowerCase();
        return filename.endsWith(".xls") || filename.endsWith(".xlsx");
    }


}
